#ifndef SYMBOLEVALUE_H
#define SYMBOLEVALUE_H

#include <string.h>
#include <iostream>
using namespace std;

#include "Symbole.h"
#include "Arbre.h"
#include "Valeur.h"

/*! \file SymboleValue.h
    \brief La spécification de la classe SymboleValue
   
    Décrit la liste des méthodes et attributs associés aux symboles values, c'est à dire les
 * cases du tableau des symboles values. Ceux-ci sont à la fois des Symboles et des Noeuds terminaux.
    \author Fraisse A. & Froment J.
    \date 06/2012
 */

/*! \class SymboleValue
    \brief La classe représentant les symboles values
   
 Cette classe SymbolesValues est constitué des méthodes :
 *      *\li void afficher (unsigned short indentation=0)
        *\li getValeur()
	*\li setValeur(Valeur* valeur)
        *\li estDefini   
 */

class SymboleValue : public Symbole,  // un symbole valué est un symbole qui a une valeur, définie ou pas
                     public Noeud  {  // et c'est aussi une feuille de l'arbre abstrait
public:
          SymboleValue(Symbole s); // construit un symbole valué à partir d'un symbole existant s
          ~SymboleValue( ) {}
          void afficher (unsigned short indentation=0);                        // affiche le symbole en tant que noeud de l'arbre
          inline Valeur*  getValeur()              { return valeur;                     } // accesseur
	  void setValeur(Valeur* valeur)    { this->valeur=valeur; defini=true;  } // accesseur
          inline bool estDefini()                  { return defini;                     } // accesseur

          friend ostream & operator << (ostream & cout, SymboleValue symb); // affiche un symbole value sur cout

private:
          bool defini;  // indique si la valeur du symbole est définie
          Valeur* valeur;  // valeur du symbole si elle est définie, zéro sinon

};

#endif /* SYMBOLEVALUE_H */
